package cl.tinet.trainee.proyecto.dao;

import java.util.ArrayList;

import javax.ejb.Remote;

import cl.tinet.trainee.proyecto.excepciones.DatosNulosException;

/**
 * Interfaz que define los metodos a implementar por la clase DAO.
 * 
 * @author Jose Palma
 * @param <T>
 */
@Remote
public interface InterfazGenericaDAO<T> {

    /**
     * Recibe del bean un objeto y lo agrega a la base de datos.
     * 
     * @param nuevoObjeto
     *            Es el objeto que recibe el metodo y agrega a la base de
     *            datos.
     */
    void agregar(T nuevoObjeto);

    /**
     * Recibe del bean un usuario y lo elimina de la base de datos.
     * 
     * @param objetoAEliminar
     *            Es el objeto que recibe el metodo, para buscarlo y eliminar
     *            a su par.
     */
    void borrar(T objetoAEliminar);

    /**
     * Recibe del bean un objeto y lo actualiza a la base de datos.
     * 
     * @param objetoAActualizar
     *            Es el objeto que recibe el metodo, para buscarlo y
     *            actualizar sus datos.
     */
    void actualizar(T objetoAActualizar);

    /**
     * Recibe del bean un objeto y lee sus atributos desde la base de datos.
     * 
     * @param objetoABuscar
     *            Objeto que se busca en la base de datos.
     * @return Objeto encontrado es retornado para desplegar sus datos.
     * @throws DatosNulosException
     *             Se genera cuando la consulta no genera resultados.
     */
    T buscar(T objetoABuscar) throws DatosNulosException;

    /**
     * Metodo que retorna la lista de todos los objetos.
     * 
     * @return Retorna una lista con todos los objetos de la tabla existentes
     *         en la base de datos.
     */
    ArrayList<T> listar();
}
